package com.example;

/**
 * 案例七：找素数
 */
public class Test7 {
    public static void main(String[] args) {
        // 需求：除了1和它本身以外,不能被其他正整数整除,就叫素数
        // System.out.println("当前素数的个数是：" + isPrime1(101, 200));

        // System.out.println("当前素数的个数是：" + isPrime2(101, 200));

        // 方法3
        int count = 0;
        for (int i = 101; i <= 200; i++) {
            if (checkPrime(i)) {
                System.out.println(i);
                count++;
            }
        }
        System.out.println("当前素数的个数是：" + count);
    }

    /**
     * 检查当前数是不是素数
     *
     * @param n 要检查的数
     * @return true:是素数 false:不是素数
     */
    public static boolean checkPrime(int n) {
        // 循环从2开始,直到当前数的一半,如果在这个期间没有被其他数整除,就说明是素数,反之不是素数返回false
        for (int i = 2; i <= n / 2; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    /**
     * 方法1
     * 查找指定区间范围内容的素数 - 除了1和它本身以外,不能被其他正整数整除,就叫素数
     *
     * @param start 开始范围
     * @param end   结束范围
     * @return 素数的个数
     */
    public static int isPrime1(int start, int end) {
        // 1.用于记录素数的个数
        int count = 0;
        // 2.定义一个循环找到101-200之间的每个数据
        for (int i = start; i <= end; i++) {
            // i = 101 102 103 104 ... 199 200

            // 假设当前i记住的数据是素数
            boolean flag = true;

            // 3.判断当前i是不是素数
            // 循环从2开始,直到当前数的一半,如果在这个期间没有被其他数整除,就说明是素数
            for (int j = 2; j <= i / 2; j++) {
                if (i % j == 0) {
                    // 说明不是素数
                    flag = false;
                    break;
                }
            }

            // 4.根据flag判断i是否为素数如果是输出 不是就不输出
            if (flag) {
                System.out.println(i);
                count++;
            }
        }

        // 5.返回素数的个数
        return count;
    }

    /**
     * 方法2
     * 查找指定区间范围内容的素数 - 除了1和它本身以外,不能被其他正整数整除,就叫素数
     *
     * @param start 开始范围
     * @param end   结束范围
     * @return 素数的个数
     */
    public static int isPrime2(int start, int end) {
        // 1.用于记录素数的个数
        int count = 0;


        // 2.定义一个循环找到101-200之间的每个数据
        OUT:
        // 外部循环的标签 类似于c语言的goto语句
        for (int i = start; i <= end; i++) {
            // i = 101 102 103 104 ... 199 200

            // 3.判断当前i是不是素数
            // 循环从2开始,直到当前数的一半,如果在这个期间没有被其他数整除,就说明是素数
            for (int j = 2; j <= i / 2; j++) {
                if (i % j == 0) {
                    // 说明不是素数不能打印,之间跳转到外部循环
                    continue OUT; // 结束外部循环的当前执行
                }
            }

            System.out.println(i);
            count++;
        }

        // 5.返回素数的个数
        return count;
    }
}
